package com.jiunuan.live.account.provider.service.impl;

import com.jiunuan.live.account.provider.service.IAccountTokenService;
import com.jiunuan.live.common.interfaces.utils.DESUtils;
import com.jiunuan.live.framework.redis.starter.key.AccountProviderCacheKeyBuilder;
import jakarta.annotation.Resource;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import java.util.Set;
import java.util.UUID;
import java.util.concurrent.TimeUnit;

@Service
public class AccountTokenServiceImpl implements IAccountTokenService {
    @Resource
    private RedisTemplate<String,Object> redisTemplate;
    @Resource
    private AccountProviderCacheKeyBuilder cacheKeyBuilder;
    /**
     * 创建并保存登录token
     * 此方法旨在为用户创建一个新的登录token，并将其保存在Redis中
     * 如果用户已登录，则删除旧的token，确保系统中每个用户只有一个活跃的登录状态
     *
     * @param userId 用户ID，用于生成token和查询旧token
     * @return 返回生成的token字符串
     */
    @Override
    public String createAndSaveLoginToken(Long userId) {
        // 考虑用户登陆后删除旧token，保证系统在线用户唯一
        // 1. 使用DES算法对用户id进行加密
        String encryptedUserId = "--" + DESUtils.encrypt(String.valueOf(userId));
        // 2. 通过Redis的模糊匹配功能，查找所有可能的旧token key
        Set<String> oldTokenKeys = redisTemplate.keys("*" + encryptedUserId);
        // 3. 删除所有匹配的旧token key
        if (oldTokenKeys != null) {
            for (String key : oldTokenKeys) {
                redisTemplate.delete(key);
            }
        }
        // 4. 生成新的token
        String token = UUID.randomUUID() + encryptedUserId ;

        // 将新的token与用户ID关联，并设置过期时间为30天
        redisTemplate.opsForValue().set(cacheKeyBuilder.buildUserLoginTokenKey(token), String.valueOf(userId), 30, TimeUnit.DAYS);
        return token;
    }

    @Override
    public Long getUserIdByToken(String tokenKey) {
        String redisKey = cacheKeyBuilder.buildUserLoginTokenKey(tokenKey);
        Integer userId = (Integer) redisTemplate.opsForValue().get(redisKey);
        return userId == null ? null : Long.valueOf(userId);
    }
}
